// 测试 Array对象的 原型属性 (即在 Array.prototype 上定义的属性)

const numbers = [ 1, 3, 5, 7, 9 ];

// Array.prototype.reduce( reducer [ , initial ] )

/**
 * reducer 函数可以有四个参数
 * @param previous 表示前一个值
 * @param current 表示当前从数组中获取的元素(可以是任意类型)
 * @param {number} index 当前元素的索引值
 * @param {Array} array 当前数组本身
 * @returns 返回 前一个值 和 当前值 之和
 */
let reducer = function(previous,current,index,array){
    console.log( `previous: ${previous}` +
                 ` , current: ${current}` + 
                 ` , index: ${index}` +
                 ` , array: ${array}`);
    // 返回 前一个值 和 当前值 之和
    return previous + current ;
}
// 正向归并
let sum = numbers.reduce( reducer , 0 ); // 第二个参数表示初始值
console.log( sum );

console.log( '- '.repeat(25) );

// 反向归并
sum = numbers.reduceRight( reducer , 0 ); // 第二个参数表示初始值
console.log( sum );

console.log( '- '.repeat(25) );

const items = [
    { id: 2123 , name: '小米MIX 4' , price: 4999 , amount: 1 },
    { id: 3112 , name: '中兴Axon 30' , price: 2299 , amount: 2 },
    { id: 4321 , name: '红魔7Pro' , price: 6999 , amount: 1 },
    { id: 5432 , name: '中兴Axon 40' , price: 9999 , amount: 1 }
];

let accumulator = (previous,current,index,array) => {
    let subtotal = current.price * current.amount ;
    console.log( 'current: ' , current , ' , subtotal: ' , subtotal );
    // 返回 前一个值 和 当前项目的小计 之和
    return previous + subtotal ;
}

let total = items.reduce( accumulator , 0 );
console.log( total );
